package com.zyf.project.binaryproto.specification;

import com.zyf.project.binaryproto.codec.NumberEncoding;
import com.zyf.project.binaryproto.annotation.DataField;
import com.zyf.project.binaryproto.type.PrimitiveType;

/**
 * <h1>数据契约字段的格式标准</h1>
 *
 * @author Zhou Yifan
 */
public interface FieldSpecification {

    /**
     * 字段名称
     *
     * @return 字符串
     */
    String getName();

    /**
     * 字段描述
     *
     * @return 字符串
     */
    String getDescription();

    /**
     * <p>字段值的类型</p>
     * <p>如果不是基本类型则返回 null，即 {@link DataField#primitiveType()} 设置为 {@link PrimitiveType#NIL}</p>
     *
     * @return {@link PrimitiveType}
     */
    PrimitiveType getPrimitiveType();

    /**
     * 数值编码方式，只有 {@link DataField#primitiveType()} 为整数时（INT8 ~ INT64）时才有效
     *
     * @return {@link NumberEncoding}
     */
    NumberEncoding getNumberEncoding();

    /**
     * 字段值引用的枚举契约
     *
     * @return {@link EnumSpecification}
     */
    EnumSpecification getRefEnum();

    /**
     * 字段引用的数据契约，如果不是数据契约的类型，则返回 null
     *
     * @return {@link DataSpecification}
     */
    DataSpecification getRefContract();

    /**
     * 是否是多值列表，或者说是否可重复
     *
     * @return 布尔值
     */
    boolean isRepeatable();

    /**
     * 最大长度（可变长度的最大长度），可以参考 {@link DataField#maxSize()}
     *
     * @return int 值，表示的单位是 byte
     */
    int getMaxSize();

    /**
     * 是否引用了一个通用数据契约类型，实际的数据契约需要根据实际的对象列表来定
     *
     * @return 布尔值
     */
    boolean isGenericContract();

}
